<!--
 * @Author: your name
 * @Date: 2019-12-26 10:33:32
 * @LastEditTime: 2019-12-27 15:37:53
<title>git命令手册</title>
 * @LastEditors: your name
 * @Description: In User Settings Edit
 * @FilePath: \html\template.html
 -->
<!doctype html>
<html style='font-size:15px !important'>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<!-- typora md 样式可以修改-->
<link href="http://gismsl.gitee.io/html/css/theme/vlook-hope.css" rel="stylesheet" />
<link href="http://gismsl.gitee.io/html/css/index.css" rel="stylesheet" />
<script src="http://gismsl.gitee.io/html/js/index.js"></script>
<script src="http://gismsl.gitee.io/html/js/template.js"></script>
</head>

<body class='typora-export os-windows' >
<div  id='write'  class = 'is-node first-line-indent'><div class='md-toc' mdtype='toc'><p class="md-toc-content" role="list"><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n217"><a class="md-toc-inner" href="#git简介">git简介</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n34"><a class="md-toc-inner" href="#git配置命令">git配置命令</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n62"><a class="md-toc-inner" href="#工作区上的操作命令">工作区上的操作命令</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n112"><a class="md-toc-inner" href="#暂存区上的操作命令">暂存区上的操作命令</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n182"><a class="md-toc-inner" href="#本地仓库上的操作">本地仓库上的操作</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n198"><a class="md-toc-inner" href="#忽略文件gitignore">忽略文件.gitignore</a></span></p></div><h1><a name="git简介" class="md-header-anchor"></a><span>git简介</span></h1><p><span>在实际开发中，会使用git作为版本控制工具来完成团队协作。因此，对基本的git操作指令进行总结是十分有必要的，本文对一些术语或者理论基础，不重新码字，可以</span><a href='https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000'><span>参考廖雪峰老师的博文</span></a><span>，本文只对命令做归纳总结。</span></p><p><span>git的通用操作流程如下图（来源于网络）</span></p><p>&nbsp;</p><p><img src="assets/git命令手册/162fcc0987bf1c0a" referrerpolicy="no-referrer" alt="git操作通用流程"></p><p>&nbsp;</p><p><span>主要涉及到四个关键点：</span></p><ol><li><span>工作区：本地电脑存放项目文件的地方，比如learnGitProject文件夹；</span></li><li><span>暂存区（Index/Stage）：在使用git管理项目文件的时候，其本地的项目文件会多出一个.git的文件夹，将这个.git文件夹称之为版本库。其中.git文件夹中包含了两个部分，一个是暂存区（Index或者Stage）,顾名思义就是暂时存放文件的地方，通常使用add命令将工作区的文件添加到暂存区里；</span></li><li><span>本地仓库：.git文件夹里还包括git自动创建的master分支，并且将HEAD指针指向master分支。使用commit命令可以将暂存区中的文件添加到本地仓库中；</span></li><li><span>远程仓库：不是在本地仓库中，项目代码在远程git服务器上，比如项目放在github上，就是一个远程仓库，通常使用clone命令将远程仓库拷贝到本地仓库中，开发后推送到远程仓库中即可；</span></li></ol><p><span>更细节的来看：</span></p><p>&nbsp;</p><p><img src="assets/git命令手册/162fcc0e7e711dc7" referrerpolicy="no-referrer" alt="git几个核心区域间的关系"></p><p>&nbsp;</p><p><span>日常开发时代码实际上放置在工作区中，也就是本地的XXX.java这些文件，通过add等这些命令将代码文教提交给暂存区（Index/Stage），也就意味着代码全权交给了git进行管理，之后通过commit等命令将暂存区提交给master分支上，也就是意味打了一个版本，也可以说代码提交到了本地仓库中。另外，团队协作过程中自然而然还涉及到与远程仓库的交互。</span></p><p><span>因此，经过这样的分析，git命令可以分为这样的逻辑进行理解和记忆：</span></p><ol><li><p><span>git管理配置的命令；</span></p><p><strong><span>几个核心存储区的交互命令：</span></strong></p></li><li><p><span>工作区与暂存区的交互；</span></p></li><li><p><span>暂存区与本地仓库（分支）上的交互；</span></p></li><li><p><span>本地仓库与远程仓库的交互。</span></p></li></ol><h1><a name="git配置命令" class="md-header-anchor"></a><span>git配置命令</span></h1><blockquote><p><span>查询配置信息</span></p></blockquote><ol><li><span>列出当前配置：</span><code>git config --list</code><span>;</span></li><li><span>列出repository配置：</span><code>git config --local --list</code><span>;</span></li><li><span>列出全局配置：</span><code>git config --global --list</code><span>;</span></li><li><span>列出系统配置：</span><code>git config --system --list</code><span>;</span></li></ol><blockquote><p><span>第一次使用git，配置用户信息</span></p></blockquote><ol><li><span>配置用户名：</span><code>git config --global user.name &quot;your name&quot;</code><span>;</span></li><li><span>配置用户邮箱：</span><code>git config --global user.email &quot;youremail@github.com&quot;</code><span>;</span></li></ol><blockquote><p><span>其他配置</span></p></blockquote><ol><li><span>配置解决冲突时使用哪种差异分析工具，比如要使用vimdiff：</span><code>git config --global merge.tool vimdiff</code><span>;</span></li><li><span>配置git命令输出为彩色的：</span><code>git config --global color.ui auto</code><span>;</span></li><li><span>配置git使用的文本编辑器：</span><code>git config --global core.editor vi</code><span>;</span></li></ol><h1><a name="工作区上的操作命令" class="md-header-anchor"></a><span>工作区上的操作命令</span></h1><blockquote><p><span>新建仓库</span></p></blockquote><ol><li><span>将工作区中的项目文件使用git进行管理，即创建一个新的本地仓库：</span><code>git init</code><span>；</span></li><li><span>从远程git仓库复制项目：</span><code>git clone</code><span>，如：git clone git://github.com/wasd/example.git;克隆项目时如果想定义新的项目名，可以在clone命令后指定新的项目名：</span><code>git clone git://github.com/wasd/example.git mygit</code><span>；</span></li></ol><blockquote><p><span>提交</span></p></blockquote><ol><li><span>提交工作区所有文件到暂存区：</span><code>git add .</code></li><li><span>提交工作区中指定文件到暂存区：</span><code>git add   ...</code><span>;</span></li><li><span>提交工作区中某个文件夹中所有文件到暂存区：</span><code>git add [dir]</code><span>;</span></li></ol><blockquote><p><span>撤销</span></p></blockquote><ol><li><span>删除工作区文件，并且也从暂存区删除对应文件的记录：</span><code>git rm</code><span>;</span></li><li><span>从暂存区中删除文件，但是工作区依然还有该文件:</span><code>git rm --cached</code><span>;</span></li><li><span>取消暂存区已经暂存的文件：</span><code>git reset HEAD ...</code><span>;</span></li><li><span>撤销上一次对文件的操作：</span><code>git checkout --</code><span>。要确定上一次对文件的修改不再需要，如果想保留上一次的修改以备以后继续工作，可以使用stashing和分支来处理；</span></li><li><span>隐藏当前变更，以便能够切换分支：</span><code>git stash</code><span>；</span></li><li><span>查看当前所有的储藏：</span><code>git stash list</code><span>；</span></li><li><span>应用最新的储藏：</span><code>git stash apply</code><span>，如果想应用更早的储藏：</span><code>git stash apply stash@{2}</code><span>；重新应用被暂存的变更，需要加上</span><code>--index</code><span>参数：</span><code>git stash apply --index</code><span>;</span></li><li><span>使用apply命令只是应用储藏，而内容仍然还在栈上，需要移除指定的储藏：</span><code>git stash drop stash{0}</code><span>；如果使用pop命令不仅可以重新应用储藏，还可以立刻从堆栈中清除：</span><code>git stash pop</code><span>;</span></li><li><span>在某些情况下，你可能想应用储藏的修改，在进行了一些其他的修改后，又要取消之前所应用储藏的修改。Git没有提供类似于 stash unapply 的命令，但是可以通过取消该储藏的补丁达到同样的效果：</span><code>git stash show -p stash@{0} | git apply -R</code><span>；同样的，如果你沒有指定具体的某个储藏，Git 会选择最近的储藏：</span><code>git stash show -p | git apply -R</code><span>；</span></li></ol><blockquote><p><span>更新文件</span></p></blockquote><ol><li><span>重命名文件，并将已改名文件提交到暂存区：</span><code>git mv [file-original] [file-renamed]</code><span>;</span></li></ol><blockquote><p><span>查新信息</span></p></blockquote><ol><li><span>查询当前工作区所有文件的状态：</span><code>git status</code><span>;</span></li><li><span>比较工作区中当前文件和暂存区之间的差异，也就是修改之后还没有暂存的内容：git diff；指定文件在工作区和暂存区上差异比较：</span><code>git diff</code><span>;</span></li></ol><h1><a name="暂存区上的操作命令" class="md-header-anchor"></a><span>暂存区上的操作命令</span></h1><blockquote><p><span>提交文件到版本库</span></p></blockquote><ol><li><span>将暂存区中的文件提交到本地仓库中，即打上新版本：</span><code>git commit -m &quot;commit_info&quot;</code><span>;</span></li><li><span>将所有已经使用git管理过的文件暂存后一并提交，跳过add到暂存区的过程：</span><code>git commit -a -m &quot;commit_info&quot;</code><span>;</span></li><li><span>提交文件时，发现漏掉几个文件，或者注释写错了，可以撤销上一次提交：</span><code>git commit --amend</code><span>;</span></li></ol><blockquote><p><span>查看信息</span></p></blockquote><ol><li><span>比较暂存区与上一版本的差异：</span><code>git diff --cached</code><span>;</span></li><li><span>指定文件在暂存区和本地仓库的不同：</span><code>git diff  --cached</code><span>;</span></li><li><span>查看提交历史：git log；参数</span><code>-p</code><span>展开每次提交的内容差异，用</span><code>-2</code><span>显示最近的两次更新，如</span><code>git log -p -2</code><span>;</span></li></ol><blockquote><p><span>打标签</span></p></blockquote><p><span>Git 使用的标签有两种类型：</span><strong><span>轻量级的（lightweight）和含附注的（annotated）</span></strong><span>。轻量级标签就像是个不会变化的分支，实际上它就是个指向特定提交对象的引用。而含附注标签，实际上是存储在仓库中的一个独立对象，它有自身的校验和信息，包含着标签的名字，电子邮件地址和日期，以及标签说明，标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签，以便保留相关信息；当然，如果只是临时性加注标签，或者不需要旁注额外信息，用轻量级标签也没问题。</span></p><ol><li><span>列出现在所有的标签：</span><code>git tag</code><span>;</span></li><li><span>使用特定的搜索模式列出符合条件的标签，例如只对1.4.2系列的版本感兴趣：</span><code>git tag -l &quot;v1.4.2.*&quot;</code><span>;</span></li><li><span>创建一个含附注类型的标签，需要加</span><code>-a</code><span>参数，如</span><code>git tag -a v1.4 -m &quot;my version 1.4&quot;</code><span>;</span></li><li><span>使用git show命令查看相应标签的版本信息，并连同显示打标签时的提交对象：</span><code>git show v1.4</code><span>;</span></li><li><span>如果有自己的私钥，可以使用GPG来签署标签，只需要在命令中使用</span><code>-s</code><span>参数：</span><code>git tag -s v1.5 -m &quot;my signed 1.5 tag&quot;</code><span>;</span></li><li><span>验证已签署的标签：git tag -v ，如</span><code>git tag -v v1.5</code><span>;</span></li><li><span>创建一个轻量级标签的话，就直接使用git tag命令即可，连</span><code>-a</code><span>,</span><code>-s</code><span>以及</span><code>-m</code><span>选项都不需要，直接给出标签名字即可，如</span><code>git tag v1.5</code><span>;</span></li><li><span>将标签推送到远程仓库中：git push origin ，如</span><code>git push origin v1.5</code><span>；</span></li><li><span>将本地所有的标签全部推送到远程仓库中：</span><code>git push origin --tags</code><span>;</span></li></ol><blockquote><p><span>分支管理</span></p></blockquote><ol><li><span>创建分支：</span><code>git branch</code><span>，如</span><code>git branch testing</code><span>；</span></li><li><span>从当前所处的分支切换到其他分支：</span><code>git checkout</code><span>，如</span><code>git checkout testing</code><span>；</span></li><li><span>新建并切换到新建分支上：</span><code>git checkout -b</code><span>;</span></li><li><span>删除分支：</span><code>git branch -d</code><span>；</span></li><li><span>将当前分支与指定分支进行合并：</span><code>git merge</code><span>;</span></li><li><span>显示本地仓库的所有分支：</span><code>git branch</code><span>;</span></li><li><span>查看各个分支最后一个提交对象的信息：</span><code>git branch -v</code><span>;</span></li><li><span>查看哪些分支已经合并到当前分支：</span><code>git branch --merged</code><span>;</span></li><li><span>查看当前哪些分支还没有合并到当前分支：</span><code>git branch --no-merged</code><span>;</span></li><li><span>把远程分支合并到当前分支：</span><code>git merge /</code><span>，如</span><code>git merge origin/serverfix</code><span>；如果是单线的历史分支不存在任何需要解决的分歧，只是简单的将HEAD指针前移，所以这种合并过程可以称为快进（Fast forward），而如果是历史分支是分叉的，会以当前分叉的两个分支作为两个祖先，创建新的提交对象；如果在合并分支时，遇到合并冲突需要人工解决后，再才能提交；</span></li><li><span>在远程分支的基础上创建新的本地分支</span><code>：git checkout -b  /</code><span>，如</span><code>git checkout -b serverfix origin/serverfix</code><span>;</span></li><li><span>从远程分支checkout出来的本地分支，称之为跟踪分支。在跟踪分支上向远程分支上推送内容：</span><code>git push</code><span>。该命令会自动判断应该向远程仓库中的哪个分支推送数据；在跟踪分支上合并远程分支：</span><code>git pull</code><span>；</span></li><li><span>将一个分支里提交的改变移到基底分支上重放一遍：</span><code>git rebase</code><span>，如</span><code>git rebase master server</code><span>，将特性分支server提交的改变在基底分支master上重演一遍；使用rebase操作最大的好处是像在单个分支上操作的，提交的修改历史也是一根线；如果想把基于一个特性分支上的另一个特性分支变基到其他分支上，可以使用</span><code>--onto</code><span>操作：</span><code>git rebase --onto</code><span>，如</span><code>git rebase --onto master server client</code><span>；使用rebase操作应该遵循的原则是：</span><strong><span>一旦分支中的提交对象发布到公共仓库，就千万不要对该分支进行rebase操作</span></strong><span>；</span></li></ol><h1><a name="本地仓库上的操作" class="md-header-anchor"></a><span>本地仓库上的操作</span></h1><ol><li><span>查看本地仓库关联的远程仓库：</span><code>git remote</code><span>；在克隆完每个远程仓库后，远程仓库默认为</span><code>origin</code><span>;加上</span><code>-v</code><span>的参数后，会显示远程仓库的</span><code>url</code><span>地址；</span></li><li><span>添加远程仓库，一般会取一个简短的别名：</span><code>git remote add [remote-name] [url]</code><span>，比如：</span><code>git remote add example git://github.com/example/example.git</code><span>;</span></li><li><span>从远程仓库中抓取本地仓库中没有的更新：</span><code>git fetch [remote-name]</code><span>，如</span><code>git fetch origin</code><span>;使用fetch只是将远端数据拉到本地仓库，并不自动合并到当前工作分支，只能人工合并。如果设置了某个分支关联到远程仓库的某个分支的话，可以使用</span><code>git pull</code><span>来拉去远程分支的数据，然后将远端分支自动合并到本地仓库中的当前分支；</span></li><li><span>将本地仓库某分支推送到远程仓库上：</span><code>git push [remote-name] [branch-name]</code><span>，如</span><code>git push origin master</code><span>；如果想将本地分支推送到远程仓库的不同名分支：</span><code>git push  :</code><span>，如</span><code>git push origin serverfix:awesomebranch</code><span>;如果想删除远程分支：</span><code>git push [romote-name] :</code><span>，如</span><code>git push origin :serverfix</code><span>。这里省略了本地分支，也就相当于将空白内容推送给远程分支，就等于删掉了远程分支。</span></li><li><span>查看远程仓库的详细信息：</span><code>git remote show origin</code><span>；</span></li><li><span>修改某个远程仓库在本地的简称：</span><code>git remote rename [old-name] [new-name]</code><span>，如</span><code>git remote rename origin org</code><span>；</span></li><li><span>移除远程仓库：</span><code>git remote rm [remote-name]</code><span>；</span></li></ol><h1><a name="忽略文件gitignore" class="md-header-anchor"></a><span>忽略文件.gitignore</span></h1><p><span>一般我们总会有些文件无需纳入 Git 的管理，也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件，比如日志文件，或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore 的文件，列出要忽略的文件模式。如下例：</span></p><pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang=""><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"># 此为注释 – 将被 Git 忽略</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"># 忽略所有 .a 结尾的文件</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">*.a</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"># 但 lib.a 除外</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">!lib.a</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"># 仅仅忽略项目根目录下的 TODO 文件，不包括 subdir/TODO</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">/TODO</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"># 忽略 build/ 目录下的所有文件</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">build/</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"># 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">doc/*.txt</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"># 忽略 doc/ 目录下所有扩展名为 txt 的文件</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">doc/**/*.txt</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">复制代码</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 336px;"></div><div class="CodeMirror-gutters" style="display: none; height: 336px;"></div></div></div></pre><blockquote><p><span>参考资料</span></p></blockquote><p><a href='https://git-scm.com/book/zh/v1/起步-关于版本控制'><span>非常详细准确的git学习资料</span></a><span>；</span></p><p><a href='https://github.com/flyhigher139/Git-Cheat-Sheet#配置'><span>git-cheat-sheet中文版</span></a></p><p><a href='http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html'><span>命令总结，资料一般，不够详细，作参考</span></a></p><p><a href='http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html'><span>常用命令很全</span></a></p><p><span>作者：你听___</span>
<span>链接：</span><a href='https://juejin.im/post/5ae072906fb9a07a9e4ce596' target='_blank' class='url'>https://juejin.im/post/5ae072906fb9a07a9e4ce596</a>
<span>来源：掘金</span>
<span>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</span></p></div>
</body>
</html>